﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioPagamento : IRepositorioPagamento
    {
        public Pagamento Inserir(Pagamento pagamento)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(pagamento);
            return pagamento;
        }

        public Pagamento Atualizar(Pagamento pagamento)
        {
            Pagamento tmpPagamento = ObterPorId(pagamento.PagamentoId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpPagamento.ContaBanco = pagamento.ContaBanco;
            tmpPagamento.DataPagamento = pagamento.DataPagamento;
            tmpPagamento.DataLancamentoPagamento = pagamento.DataLancamentoPagamento;
            tmpPagamento.FormaPagamento = pagamento.FormaPagamento;
            tmpPagamento.Usuario = pagamento.Usuario;
            tmpPagamento.Valor = pagamento.Valor;
            tmpPagamento.Cheque = pagamento.Cheque;
            tmpPagamento.Documento = pagamento.Documento;
            tmpPagamento.EnumSituacaoMovimento = pagamento.EnumSituacaoMovimento;

            GerenciadorBDConfigs.Instance.SessaoAtual().Update(tmpPagamento);
            return tmpPagamento;
        }

        public void Excluir(Pagamento pagamento)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(pagamento);
        }

        public IList<Pagamento> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Pagamento));
            return criteria.List<Pagamento>() as List<Pagamento>;
        }

        public Pagamento ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Pagamento>(id);
        }

        public decimal ObterPagamentosTitulo(Titulo titulo)
        {

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof (Pagamento))
                .Add(Restrictions.Eq("Titulo", titulo))
                .Add(Restrictions.Eq("EnumSituacaoMovimento", EnumSituacaoMovimento.Quitado)).SetProjection(Projections.Sum("Valor"));
            return criteria.UniqueResult<decimal>();
        }
    }
}